home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / c / save_sgi4.c < prev    next >
C/C++ Source or Header  |  1989-10-30  |  9KB  |  456 lines

  1.  
  2. /* for the 4d */
  3.  
  4. /*
  5. (c) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
  6. Copying of this file is authorized to users who have executed the true and
  7. proper "License Agreement for Kyoto Common LISP" with SIGLISP.
  8. */
  9.  
  10. /*
  11.     unixsave.c
  12. */
  13.  
  14.  
  15.  
  16. /* When MACHINE is S3000, use fcntl.h */
  17. #ifdef ATT
  18. #include <fcntl.h>
  19. #include <unistd.h>
  20. #else
  21. #include <sys/file.h>
  22. #endif
  23.  
  24.  
  25. #ifdef BSD
  26. #include <a.out.h>
  27. #endif
  28.  
  29. #ifdef VAX
  30. #define    PAGSIZ        1024
  31. #define    SEGSIZ        1024
  32. #define    TXTRELOC    0
  33. #endif
  34.  
  35. #ifdef ISI
  36.  
  37.  
  38.  
  39. #endif
  40.  
  41. #ifdef SEQ
  42.  
  43.  
  44. #endif
  45.  
  46. #ifdef NEWS
  47. #define    TXTRELOC    0
  48. #endif
  49.  
  50. #ifdef IBMRT
  51.  
  52.  
  53.  
  54. #endif
  55.  
  56. #ifdef ATT
  57. #include <filehdr.h>
  58. #include <aouthdr.h>
  59. #include <scnhdr.h>
  60. #include <syms.h>
  61. #define exec        aouthdr
  62. #define a_text        tsize
  63. #define a_data        dsize
  64. #define a_bss        bsize
  65. #endif
  66.  
  67. #ifdef E15
  68. #include <a.out.h>
  69. extern    etext;
  70. #define exec        bhdr
  71. #define a_text        tsize
  72. #define a_data        dsize
  73. #define a_bss        bsize
  74. #define a_syms        ssize
  75. #define a_trsize    rtsize
  76. #define a_drsize    rdsize
  77. #define    SEGSIZ        (128*1024)
  78. #define    TXTRELOC    (1024*1024)
  79. #endif
  80.  
  81. #ifndef mips
  82. filecpy(to, from, n)
  83. FILE *to, *from;
  84. register int n;
  85. {
  86.     char buffer[BUFSIZ];
  87.  
  88.     for (;;)
  89.         if (n > BUFSIZ) {
  90.             fread(buffer, BUFSIZ, 1, from);
  91.             fwrite(buffer, BUFSIZ, 1, to);
  92.             n -= BUFSIZ;
  93.         } else if (n > 0) {
  94.             fread(buffer, 1, n, from);
  95.             fwrite(buffer, 1, n, to);
  96.             break;
  97.         } else
  98.             break;
  99. }
  100. #endif
  101.  
  102. memory_save(original_file, save_file)
  103. char *original_file, *save_file;
  104. {
  105.  
  106. #ifdef BSD
  107.     struct exec header;
  108.     int stsize;
  109. #endif
  110. #ifdef ATT
  111. #ifdef mips
  112.     struct {
  113.       struct filehdr filehdr;
  114.       struct aouthdr aouthdr;
  115.       struct scnhdr 
  116.         text_section,
  117.         init_section,
  118.         rdata_section,
  119.         data_section,
  120.         lit8_section,
  121.         lit4_section,
  122.         sdata_section,
  123.         sbss_section,
  124.         bss_section;
  125.     } hdrs;
  126.     struct filehdr *pfilehdr;
  127.     struct aouthdr *paouthdr;
  128.     struct scnhdr *pscnhdr;
  129.     char buf[BUFSIZ];
  130.     HDRR symhdr;
  131.     int fptr, nbytes, pagesize;
  132. #define setbuf(stream,buf)
  133. #else
  134.     struct filehdr fileheader;
  135.     struct exec header;
  136. #endif /* mips */
  137.     int diff;
  138. #endif
  139. #ifdef E15
  140.     struct exec header;
  141. #endif
  142.  
  143.     char *data_begin, *data_end;
  144.     int original_data;
  145.     FILE *original, *save;
  146.     register int n;
  147.     register char *p;
  148.     extern char *sbrk();
  149.     extern char stdin_buf[BUFSIZ], stdout_buf[BUFSIZ];
  150.  
  151.     fclose(stdin);
  152.     original = fopen(original_file, "r");
  153.     if (stdin != original || original->_file != 0) {
  154.         fprintf(stderr, "Can't open the original file.\n");
  155.         exit(1);
  156.     }
  157.     setbuf(original, stdin_buf);
  158.     fclose(stdout);
  159.     unlink(save_file);
  160.     n = open(save_file, O_CREAT|O_WRONLY, 0777);
  161.     if (n != 1 || (save = fdopen(n, "w")) != stdout) {
  162.         fprintf(stderr, "Can't open the save file.\n");
  163.         exit(1);
  164.     }
  165.     setbuf(save, stdout_buf);
  166.  
  167. #ifdef BSD
  168.     fread(&header, sizeof(header), 1, original);
  169.  
  170. #ifdef VAX
  171.     data_begin
  172.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  173. #endif
  174. #ifdef SUN
  175.     data_begin
  176.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  177. #endif
  178. #ifdef SUN2R3
  179.     data_begin = (char *)N_DATADDR(header);
  180. #endif
  181. #ifdef SUN3
  182.     data_begin = (char *)N_DATADDR(header);
  183. #endif
  184. #ifdef NEWS
  185.     data_begin
  186.     = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  187. #endif
  188. #ifdef ISI
  189.  
  190.  
  191. #endif
  192. #ifdef SEQ
  193.  
  194.  
  195. #endif
  196. #ifdef IBMRT
  197.  
  198.  
  199. #endif
  200.  
  201.     data_end = core_end;
  202.     original_data = header.a_data;
  203.     header.a_data = data_end - data_begin;
  204.     header.a_bss = 0;
  205.     fwrite(&header, sizeof(header), 1, save);
  206.  
  207. #ifdef VAX
  208.     if (header.a_magic == ZMAGIC)
  209.         filecpy(save, original, PAGSIZ - sizeof(header));
  210.     filecpy(save, original, header.a_text);
  211. #endif
  212. #ifdef SUN
  213.     if (header.a_magic == ZMAGIC)
  214.         filecpy(save, original, PAGSIZ - sizeof(header));
  215.     filecpy(save, original, header.a_text);
  216. #endif
  217. #ifdef SUN2R3
  218.     filecpy(save, original, header.a_text - sizeof(header));
  219. #endif
  220. #ifdef SUN3
  221.     filecpy(save, original, header.a_text - sizeof(header));
  222. #endif
  223. #ifdef NEWS
  224.     if (header.a_magic == ZMAGIC)
  225.         filecpy(save, original, PAGSIZ - sizeof(header));
  226.     filecpy(save, original, header.a_text);
  227. #endif
  228. #ifdef ISI
  229.  
  230.  
  231.  
  232.  
  233. #endif
  234. #ifdef SEQ
  235.  
  236.  
  237. #endif
  238. #ifdef IBMRT
  239.  
  240.  
  241.  
  242. #endif
  243. #endif
  244.  
  245. #ifdef ATT
  246. #ifdef mips
  247. # define NSCNS 4
  248.     read(0, (char*)&hdrs.filehdr, FILHSZ + AOUTHSZ);
  249.     pfilehdr = (struct filehdr*)hdrs.aouthdr.text_start;
  250.     paouthdr = (struct aouthdr*)((long)pfilehdr + FILHSZ);
  251.     pscnhdr  = (struct scnhdr*)((long)paouthdr + AOUTHSZ);
  252.  
  253.     pagesize = getpagesize();
  254.  
  255.     hdrs.aouthdr.dsize = 
  256.       ((long)core_end - hdrs.aouthdr.data_start + pagesize - 1)
  257.         & ~(pagesize - 1);
  258.     hdrs.aouthdr.bss_start = 
  259.       hdrs.aouthdr.data_start + hdrs.aouthdr.dsize;
  260.     hdrs.aouthdr.bsize = 0;
  261.  
  262.     hdrs.filehdr.f_nscns  = NSCNS;
  263.     hdrs.filehdr.f_timdat = time(NULL);
  264.     hdrs.filehdr.f_symptr = hdrs.aouthdr.tsize + hdrs.aouthdr.dsize;
  265.  
  266.     bcopy((char*)pscnhdr, (char*)&hdrs.text_section, NSCNS * SCNHSZ);
  267.     hdrs.data_section.s_size = hdrs.aouthdr.dsize 
  268.       - hdrs.rdata_section.s_size;
  269.     bzero((char*)&hdrs.lit8_section,
  270.           sizeof hdrs - FILHSZ - AOUTHSZ - NSCNS * SCNHSZ);
  271.     fptr = write(1, &hdrs, AOUTHSZ + FILHSZ + pfilehdr->f_nscns * SCNHSZ);
  272.  
  273.     p = (char*)hdrs.aouthdr.text_start + fptr;
  274.     n = hdrs.aouthdr.tsize - fptr;
  275.     nbytes = pagesize - fptr;
  276.     write(1, p, nbytes);
  277.     p += nbytes;
  278.     n -= nbytes;
  279.     while ( n > pagesize ) {
  280.       write(1, p, pagesize);
  281.       p += pagesize;
  282.       n -= pagesize;
  283.     }
  284.     if ( n )
  285.       write(1, p, n);
  286.  
  287.     lseek(1, hdrs.rdata_section.s_scnptr, SEEK_SET);
  288.     p = (char*)hdrs.aouthdr.data_start;
  289.     n = hdrs.aouthdr.dsize;
  290.     while ( n > pagesize ) {
  291.       write(1, p, pagesize);
  292.       p += pagesize;
  293.       n -= pagesize;
  294.     }
  295.     if ( n ) 
  296.       write(1, p, n);
  297.  
  298.     lseek(0, pfilehdr->f_symptr, SEEK_SET);
  299.     diff = hdrs.filehdr.f_symptr - pfilehdr->f_symptr;
  300.     read(0, &symhdr, cbHDRR);
  301. #define adjust(field)if(symhdr.cb/**/field/**/Offset)symhdr.cb/**/field/**/Offset+= diff
  302.     adjust(Line);
  303.     adjust(Dn);
  304.     adjust(Pd);
  305.     adjust(Sym);
  306.     adjust(Opt);
  307.     adjust(Aux);
  308.     adjust(Ss);
  309.     adjust(SsExt);
  310.     adjust(Fd);
  311.     adjust(Rfd);
  312.     adjust(Ext);
  313. #undef adjust
  314.     write(1, &symhdr, cbHDRR);
  315.     while ( (n = read(0, buf, sizeof buf)) > 0 )
  316.       write(1, buf, n);
  317. #else
  318.     fread(&fileheader, sizeof(fileheader), 1, original);
  319.     fread(&header, sizeof(header), 1, original);
  320.     data_begin = (char *)header.data_start;
  321.     data_end = core_end;
  322.     original_data = header.a_data;
  323.     header.a_data = data_end - data_begin;
  324.     diff = header.a_data - original_data;
  325.     header.a_bss = sbrk(0) - core_end;
  326.     fileheader.f_symptr += diff;
  327.     fwrite(&fileheader, sizeof(fileheader), 1, save);
  328.     fwrite(&header, sizeof(header), 1, save);
  329.     fread(§ionheader, sizeof(sectionheader), 1, original);
  330.     if (sectionheader.s_lnnoptr)
  331.         sectionheader.s_lnnoptr += diff;
  332.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  333.     fread(§ionheader, sizeof(sectionheader), 1, original);
  334.     sectionheader.s_size += diff;
  335.     if (sectionheader.s_lnnoptr)
  336.         sectionheader.s_lnnoptr += diff;
  337.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  338.     fread(§ionheader, sizeof(sectionheader), 1, original);
  339.     sectionheader.s_paddr += diff;
  340.     sectionheader.s_vaddr += diff;
  341.     sectionheader.s_size = header.a_bss;
  342. #ifdef S3000
  343.         if (sectionheader.s_scnptr)
  344.                 sectionheader.s_scnptr += diff;
  345. #endif
  346.     if (sectionheader.s_lnnoptr)
  347.         sectionheader.s_lnnoptr += diff;
  348.     fwrite(§ionheader, sizeof(sectionheader), 1, save);
  349.     for (n = 4;  n <= fileheader.f_nscns;  n++) {
  350.         fread(§ionheader, sizeof(sectionheader), 1, original);
  351.         if (sectionheader.s_scnptr)
  352.             sectionheader.s_scnptr += diff;
  353.         if (sectionheader.s_lnnoptr)
  354.             sectionheader.s_lnnoptr += diff;
  355.         fwrite(§ionheader, sizeof(sectionheader), 1, save);
  356.     }
  357.     filecpy(save, original, header.a_text);
  358. #endif /* mips */
  359. #endif 
  360.  
  361. #ifdef E15
  362.     fread(&header, sizeof(header), 1, original);
  363.     if (header.fmagic != NMAGIC)
  364.         data_begin
  365.         = (char *)(TXTRELOC+header.a_text);
  366.     else
  367.         data_begin
  368.         = (char *)((TXTRELOC+header.a_text+(SEGSIZ-1)) & ~(SEGSIZ-1));
  369.     data_end = core_end;
  370.     original_data = header.a_data;
  371.     header.a_data = data_end - data_begin;
  372.     header.a_bss = sbrk(0) - core_end;
  373.     fwrite(&header, sizeof(header), 1, save);
  374.     filecpy(save, original, header.a_text);
  375. #endif
  376.  
  377. #ifndef mips
  378.     for (n = header.a_data, p = data_begin;  ;  n -= BUFSIZ, p += BUFSIZ)
  379.         if (n > BUFSIZ)
  380.             fwrite(p, BUFSIZ, 1, save);
  381.         else if (n > 0) {
  382.             fwrite(p, 1, n, save);
  383.             break;
  384.         } else
  385.             break;
  386.  
  387.     fseek(original, original_data, 1);
  388.  
  389. #ifdef BSD
  390.     filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
  391.     fread(&stsize, sizeof(stsize), 1, original);
  392.     fwrite(&stsize, sizeof(stsize), 1, save);
  393.     filecpy(save, original, stsize - sizeof(stsize));
  394. #endif
  395.  
  396. #ifdef ATT
  397.     for (;;) {
  398.         n = getc(original);
  399.         if (feof(original))
  400.             break;
  401.         putc(n, save);
  402.     }
  403. #endif
  404.  
  405. #ifdef E15
  406.     filecpy(save, original, header.a_syms+header.a_trsize+header.a_drsize);
  407. #endif
  408. #endif /* !mips */
  409.     fclose(original);
  410.     fclose(save);
  411. }
  412.  
  413. Lsave()
  414. {
  415.     char filename[256];
  416.  
  417.     check_arg(1);
  418.     check_type_or_pathname_string_symbol_stream(&vs_base[0]);
  419.     coerce_to_filename(vs_base[0], filename);
  420. /*
  421.     _cleanup();
  422. */
  423.     {
  424.         FILE *p;
  425.         int nfile;
  426.  
  427. #ifdef HAVE_GETDTABLESIZE
  428.         nfile = getdtablesize();
  429. #else
  430.         nfile = _NFILE;
  431. #endif
  432.         for (p = &_iob[3];  p < &_iob[nfile];  p++)
  433.             fclose(p);
  434.     }
  435.     memory_save(kcl_self, filename);
  436. /*
  437.     _exit(0);
  438. */
  439.     exit(0);
  440.     /*  no return  */
  441. }
  442.  
  443.  
  444. #ifdef ISI
  445.  
  446.  
  447.  
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455. #endif
  456.